ZT Blog
algorithm

bdfz 2025 winter day1

bdfz 2025 winter day1

GCD

GCD CRT 逆元

扩展欧几里得算法(Exgcd)用于求解方程 ax+by=gcd(a,b)ax + by = \gcd(a, b) 的整数解 xxyy,同时返回 aabb 的最大公约数。以下是代码的逐层解释:

递归终止条件

b=0b = 0 时,方程为 a1+00=aa \cdot 1 + 0 \cdot 0 = a,此时:

  • x=1x = 1, y=0y = 0

  • 直接返回 aa(最大公约数)

递归过程

  1. 递归调用:计算 gcd(b,a%b)\gcd(b, a \% b),得到解 xx'yy',满足:
bx+(a%b)y=gcd(b,a%b)b \cdot x' + (a \% b) \cdot y' = \gcd(b, a \% b)

根据欧几里得算法,gcd(a,b)=gcd(b,a%b)\gcd(a, b) = \gcd(b, a \% b)

  1. 转换解:将递归结果的解 xx'yy' 转换为当前层的解 xxyy。利用 a%b=aa/bba \% b = a - \lfloor a/b \rfloor \cdot b,原方程可重写为:
ay+b(xa/by)=gcd(a,b)a \cdot y' + b \cdot (x' - \lfloor a/b \rfloor \cdot y') = \gcd(a, b)

因此:

  • x=yx = y'

  • y=xa/byy = x' - \lfloor a/b \rfloor \cdot y'

代码步骤

  • 保存递归前的 xxint t = x(此时 x=xx = x')。

  • 更新 xxx = y(将 xx 设为 yy')。

  • 更新 yyy = t - (a / b) * y(计算 y=xa/byy = x' - \lfloor a/b \rfloor \cdot y')。

示例分析

a=30a = 30, b=12b = 12 为例:

  1. 递归至 gcd(6,0)\gcd(6, 0),返回 x=1x = 1, y=0y = 0, gcd=6\gcd = 6

  2. 回溯到 gcd(12,6)\gcd(12, 6),计算 x=0x = 0, y=1y = 1,满足 120+61=612 \cdot 0 + 6 \cdot 1 = 6

  3. 回溯到 gcd(30,12)\gcd(30, 12),计算 x=1x = 1, y=2y = -2,满足 301+12(2)=630 \cdot 1 + 12 \cdot (-2) = 6

总结

代码通过递归分解问题,逐步缩小规模。每次递归后,利用子问题的解 xx'yy' 推导当前层的解 xxyy,最终得到满足 ax+by=gcd(a,b)ax + by = \gcd(a, b) 的整数解。

CRT

bdfz 2025 winter day1 - ZT Blog